Давайте разберемся как изменить цвета элементов в диалоговом окне. Вот такую цветовую раскраску я хочу получить. Этот шаг является некоторым развитием шага 48, в котором мы просто меняли стиль закраски окна. Теперь мы можем менять цвет отдельных элементов.
Создаем приложение MFC AppWizard на базе диалогового окна с именем TestDlg. Для управления цветами нам надо перехватить сообщение WM_CTRCOLOR. Это можно сделать через Add Windows Message Handler. В таблице откликов должна появиться следующая запись.
BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog) ........ ON_WM_CTLCOLOR() ........ END_MESSAGE_MAP()
Общая мысль заключается в том, что есть возможность создать кисть для каждого отдельного типа элементов управления и сохранив ее использовать для закраски этих элементов вот и объявим ее в классе диалогового окна.
class CTestDlgDlg : public CDialog
{
......
//}}AFX_DATA
CBrush* m_pEditBkBrush;
......
};
В конструкторе ее надо записать:
CTestDlgDlg::CTestDlgDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlgDlg::IDD, pParent)
{
......
m_pEditBkBrush = new CBrush(RGB(0, 0, 0));
}
И удалить при разрушении окна:
BOOL CTestDlgDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
delete m_pEditBkBrush;
return CDialog::DestroyWindow();
}
Ну, а теперь сама функция обработки цветов.
HBRUSH CTestDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch (nCtlColor)
{
case CTLCOLOR_EDIT:
{
pDC->SetTextColor(RGB(0, 255, 0));
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
}
default:
return (HBRUSH) CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
}
В параметре nCtlColor передается тип элемента, к которому требуется тип закраски. И в зависимости от него мы возврашаем кисть.